import frappe
import os
import re
import shutil
from theme.utils.html_block_utils import get_home_navigation_html, get_home_navigation_css, create_html_block
from theme.utils.workspace_utils import (
    backup_workspace, 
    restore_workspace_from_backup, 
    add_custom_block_to_workspace, 
    clean_workspace_elements
)
from theme.utils.workspace_shortcuts_utils import (
    import_workspace_shortcuts,
    remove_workspace_shortcuts
)
from theme.utils.architecture_menu_utils import (
    add_architecture_menu_item,
    remove_architecture_menu_item
)
from theme.utils.navbar_utils import (
    backup_navbar_help_dropdown,
    remove_help_dropdown_items,
    restore_navbar_help_dropdown_from_backup,
    clean_navbar_backup_files
)
# 导入卸载模块
from theme.uninstall import (
    restore_home_workspace,
    delete_home_html_block,
    remove_workspace_shortcuts_on_uninstall,
    remove_architecture_menu_on_uninstall,
    restore_help_dropdown_on_uninstall,
    restore_erpnext_branding,
    restore_frappe_branding
)

# =============================================================================
# Logo 替换相关功能模块
# 此模块包含所有与logo替换相关的函数和配置
# 主要功能：品牌化logo替换、文件路径管理、logo文件检查等
# =============================================================================

def copy_logo_and_check():
    """
    检查并复制logo文件到theme应用的公共目录
    返回: bool - 检查是否成功
    """
    import os
    import shutil
    
    # 定义logo文件路径
    source_nexblock_logo = os.path.join(frappe.get_app_path("theme"), "public/images/nexblock_logo.svg")
    source_nextjia_logo = os.path.join(frappe.get_app_path("theme"), "public/images/nextjia_logo.svg")
    
    # 目标目录 - 使用相对路径
    target_dir = "sites/assets/theme/images"
    
    try:
        # 创建目标目录（如果不存在）
        os.makedirs(target_dir, exist_ok=True)
        
        # 复制 nexblock logo (用于 Frappe 替换)
        if os.path.exists(source_nexblock_logo):
            shutil.copy2(source_nexblock_logo, target_dir + "/nexblock_logo.svg")
            print(f"✅ 成功复制 nexblock logo 到 {target_dir}/nexblock_logo.svg")
        else:
            print(f"❌ nexblock logo 源文件不存在: {source_nexblock_logo}")
            return False
        
        # 复制 nextjia logo (用于 ERPNext 替换)
        if os.path.exists(source_nextjia_logo):
            shutil.copy2(source_nextjia_logo, target_dir + "/nextjia_logo.svg")
            print(f"✅ 成功复制 nextjia logo 到 {target_dir}/nextjia_logo.svg")
        else:
            print(f"❌ nextjia logo 源文件不存在: {source_nextjia_logo}")
            return False
        
        return True
        
    except Exception as e:
        print(f"❌ 复制logo文件时出错: {str(e)}")
        frappe.log_error(f"复制logo文件失败: {str(e)}")
        return False


def update_logo_references_in_content(content):
    """
    更新hooks.py内容中的logo引用路径
    参数: content - hooks.py的字符串内容
    返回: str - 更新后的内容
    """
    import re
    
    # 定义需要替换的logo路径映射
    logo_replacements = [
        # ERPNext 相关logo替换为 nextjia
        ('"/assets/erpnext/images/erpnext-logo.svg"', '"/assets/theme/images/nextjia_logo.svg"'),
        ("'/assets/erpnext/images/erpnext-logo.svg'", "'/assets/theme/images/nextjia_logo.svg'"),
        ('"assets/erpnext/images/erpnext-logo.svg"', '"assets/theme/images/nextjia_logo.svg"'),
        ("'assets/erpnext/images/erpnext-logo.svg'", "'assets/theme/images/nextjia_logo.svg'"),
        ('/assets/erpnext/images/erpnext-logo.svg', '/assets/theme/images/nextjia_logo.svg'),
        
        # Frappe 相关logo替换为 nexblock
        ('"/assets/frappe/images/frappe-logo.svg"', '"/assets/theme/images/nexblock_logo.svg"'),
        ("'/assets/frappe/images/frappe-logo.svg'", "'/assets/theme/images/nexblock_logo.svg'"),
        ('"assets/frappe/images/frappe-logo.svg"', '"assets/theme/images/nexblock_logo.svg"'),
        ("'assets/frappe/images/frappe-logo.svg'", "'assets/theme/images/nexblock_logo.svg'"),
        ('/assets/frappe/images/frappe-logo.svg', '/assets/theme/images/nexblock_logo.svg'),
        
        # 其他常见的logo路径替换
        ('"erpnext-logo.svg"', '"nextjia_logo.svg"'),
        ("'erpnext-logo.svg'", "'nextjia_logo.svg'"),
        ('"frappe-logo.svg"', '"nexblock_logo.svg"'),
        ("'frappe-logo.svg'", "'nexblock_logo.svg'"),
    ]
    
    # 应用所有替换
    for old_path, new_path in logo_replacements:
        content = content.replace(old_path, new_path)
    
    print("✅ logo引用路径更新完成")
    return content


def restore_logo_references_in_content(content):
    """
    恢复hooks.py内容中的logo引用路径为原始状态
    参数: content - hooks.py的字符串内容
    返回: str - 恢复后的内容
    """
    import re
    
    # 定义需要恢复的logo路径映射（与update_logo_references_in_content相反）
    logo_restorations = [
        # 恢复 ERPNext 相关logo
        ('"/assets/theme/images/nextjia_logo.svg"', '"/assets/erpnext/images/erpnext-logo.svg"'),
        ("'/assets/theme/images/nextjia_logo.svg'", "'/assets/erpnext/images/erpnext-logo.svg'"),
        ('"assets/theme/images/nextjia_logo.svg"', '"assets/erpnext/images/erpnext-logo.svg"'),
        ("'assets/theme/images/nextjia_logo.svg'", "'assets/erpnext/images/erpnext-logo.svg'"),
        ('/assets/theme/images/nextjia_logo.svg', '/assets/erpnext/images/erpnext-logo.svg'),
        
        # 恢复 Frappe 相关logo
        ('"/assets/theme/images/nexblock_logo.svg"', '"/assets/frappe/images/frappe-logo.svg"'),
        ("'/assets/theme/images/nexblock_logo.svg'", "'/assets/frappe/images/frappe-logo.svg'"),
        ('"assets/theme/images/nexblock_logo.svg"', '"assets/frappe/images/frappe-logo.svg"'),
        ("'assets/theme/images/nexblock_logo.svg'", "'assets/frappe/images/frappe-logo.svg'"),
        ('/assets/theme/images/nexblock_logo.svg', '/assets/frappe/images/frappe-logo.svg'),
        
        # 恢复其他常见的logo路径
        ('"nextjia_logo.svg"', '"erpnext-logo.svg"'),
        ("'nextjia_logo.svg'", "'erpnext-logo.svg'"),
        ('"nexblock_logo.svg"', '"frappe-logo.svg"'),
        ("'nexblock_logo.svg'", "'frappe-logo.svg'"),
    ]
    
    # 应用所有恢复替换
    for old_path, new_path in logo_restorations:
        content = content.replace(old_path, new_path)
    
    print("✅ logo引用路径恢复完成")
    return content


def update_frappe_hooks_for_logos():
    """
    更新Frappe hooks.py文件中的logo引用
    专门用于替换Frappe的logo为nexblock logo
    """
    frappe_hooks_path = os.path.join(frappe.get_app_path("frappe"), "hooks.py")
    
    if not os.path.exists(frappe_hooks_path):
        print(f"❌ Frappe hooks.py文件不存在: {frappe_hooks_path}")
        return False
    
    try:
        # 创建备份文件
        backup_path = frappe_hooks_path + ".logo_backup"
        if not os.path.exists(backup_path):
            shutil.copy2(frappe_hooks_path, backup_path)
            print(f"📋 已创建Frappe hooks.py的logo备份文件: {backup_path}")
        
        # 读取文件内容
        with open(frappe_hooks_path, 'r', encoding='utf-8') as file:
            content = file.read()
        
        # 检查是否已经被修改过
        if '/assets/theme/images/nexblock_logo.svg' in content:
            print("📝 Frappe logo已经是NexBlock品牌，跳过设置")
            return True
        
        # 更新Frappe logo引用为nexblock
        content = content.replace(
            '/assets/frappe/images/frappe-logo.svg', 
            '/assets/theme/images/nexblock_logo.svg'
        )
        content = content.replace(
            '"assets/frappe/images/frappe-logo.svg"', 
            '"assets/theme/images/nexblock_logo.svg"'
        )
        content = content.replace(
            "'assets/frappe/images/frappe-logo.svg'", 
            "'assets/theme/images/nexblock_logo.svg'"
        )
        
        # 写回文件
        with open(frappe_hooks_path, 'w', encoding='utf-8') as file:
            file.write(content)
        
        print("✅ Frappe logo成功替换为NexBlock")
        return True
        
    except Exception as e:
        frappe.log_error(f"更新Frappe logo引用时出错: {str(e)}")
        print(f"❌ 更新Frappe logo引用失败: {str(e)}")
        return False


def restore_frappe_hooks_logos():
    """
    恢复Frappe hooks.py文件中的logo引用为原始状态
    """
    frappe_hooks_path = os.path.join(frappe.get_app_path("frappe"), "hooks.py")
    backup_path = frappe_hooks_path + ".logo_backup"
    
    try:
        # 优先使用备份文件恢复
        if os.path.exists(backup_path):
            shutil.copy2(backup_path, frappe_hooks_path)
            os.remove(backup_path)  # 删除备份文件
            print("✅ 成功从备份文件恢复Frappe logo配置")
            return True
        
        # 如果没有备份文件，使用正则表达式恢复
        if not os.path.exists(frappe_hooks_path):
            print(f"❌ Frappe hooks.py文件不存在: {frappe_hooks_path}")
            return False
        
        # 读取文件内容
        with open(frappe_hooks_path, 'r', encoding='utf-8') as file:
            content = file.read()
        
        # 检查是否需要恢复
        if '/assets/theme/images/nexblock_logo.svg' not in content:
            print("📝 Frappe logo已经是原始状态，无需恢复")
            return True
        
        # 恢复logo引用路径
        content = content.replace(
            '/assets/theme/images/nexblock_logo.svg',
            '/assets/frappe/images/frappe-logo.svg'
        )
        content = content.replace(
            '"assets/theme/images/nexblock_logo.svg"',
            '"assets/frappe/images/frappe-logo.svg"'
        )
        content = content.replace(
            "'assets/theme/images/nexblock_logo.svg'",
            "'assets/frappe/images/frappe-logo.svg'"
        )
        
        # 写回文件
        with open(frappe_hooks_path, 'w', encoding='utf-8') as file:
            file.write(content)
        
        print("✅ Frappe logo引用路径恢复完成")
        return True
        
    except Exception as e:
        frappe.log_error(f"恢复Frappe logo引用时出错: {str(e)}")
        print(f"❌ 恢复Frappe logo引用失败: {str(e)}")
        return False


# =============================================================================

def setup_logo_replacement():
    """
    设置logo替换配置
    统一管理所有logo替换相关操作
    包含：
    1. 验证logo文件存在性
    2. 更新hooks.py中的logo引用路径
    3. 记录logo替换状态
    """
    print("🎨 开始设置logo替换配置...")
    
    # 1. 检查logo文件是否存在
    if not copy_logo_and_check():
        print("❌ logo文件检查失败，跳过logo替换配置")
        return False
    
    # 2. 获取ERPNext hooks.py文件路径
    erpnext_hooks_path = os.path.join(frappe.get_app_path("erpnext"), "hooks.py")
    
    if not os.path.exists(erpnext_hooks_path):
        print(f"❌ ERPNext hooks.py文件不存在: {erpnext_hooks_path}")
        return False
    
    # 3. 创建备份文件（如果不存在）
    backup_path = erpnext_hooks_path + ".logo_backup"
    if not os.path.exists(backup_path):
        shutil.copy2(erpnext_hooks_path, backup_path)
        print(f"📋 已创建ERPNext hooks.py的logo备份文件: {backup_path}")
    
    # 4. 读取文件内容并更新logo引用
    try:
        with open(erpnext_hooks_path, 'r', encoding='utf-8') as file:
            content = file.read()
        
        # 检查是否已经被修改过
        if '/assets/theme/images/nextjia-logo.svg' in content:
            print("📝 logo已经是NextJia品牌，跳过设置")
            return True
        
        # 更新logo引用路径
        updated_content = update_logo_references_in_content(content)
        
        # 写回文件
        with open(erpnext_hooks_path, 'w', encoding='utf-8') as file:
            file.write(updated_content)
        
        print("✅ logo替换配置设置完成")
        return True
        
    except Exception as e:
        frappe.log_error(f"设置logo替换配置时出错: {str(e)}")
        print(f"❌ 设置logo替换配置失败: {str(e)}")
        return False


def restore_logo_replacement():
    """
    恢复logo替换配置
    统一管理所有logo恢复相关操作
    包含：
    1. 使用备份文件恢复logo引用路径
    2. 如果无备份则使用正则表达式恢复
    3. 清理备份文件
    """
    print("🔄 开始恢复logo替换配置...")
    
    # 1. 获取ERPNext hooks.py文件路径
    erpnext_hooks_path = os.path.join(frappe.get_app_path("erpnext"), "hooks.py")
    backup_path = erpnext_hooks_path + ".logo_backup"
    
    try:
        # 2. 优先使用备份文件恢复
        if os.path.exists(backup_path):
            shutil.copy2(backup_path, erpnext_hooks_path)
            os.remove(backup_path)  # 删除备份文件
            print("✅ 成功从备份文件恢复logo配置")
            return True
        
        # 3. 如果没有备份文件，则使用正则表达式恢复
        if not os.path.exists(erpnext_hooks_path):
            print(f"❌ ERPNext hooks.py文件不存在: {erpnext_hooks_path}")
            return False
        
        # 4. 读取文件内容并恢复logo引用
        with open(erpnext_hooks_path, 'r', encoding='utf-8') as file:
            content = file.read()
        
        # 检查是否需要恢复
        if '/assets/theme/images/nextjia-logo.svg' not in content:
            print("📝 logo已经是原始状态，无需恢复")
            return True
        
        # 恢复logo引用路径
        restored_content = restore_logo_references_in_content(content)
        
        # 写回文件
        with open(erpnext_hooks_path, 'w', encoding='utf-8') as file:
            file.write(restored_content)
        
        print("✅ logo替换配置恢复完成")
        return True
        
    except Exception as e:
        frappe.log_error(f"恢复logo替换配置时出错: {str(e)}")
        print(f"❌ 恢复logo替换配置失败: {str(e)}")
        return False


def after_install():
    """
    在 theme 应用安装后执行的函数
    1. 安全地修改 ERPNext 的 hooks.py 文件，和app_title 改为  NextJia
    2. 创建自定义 HTML 块记录
    3. 备份Home工作空间配置
    4. 清理Home工作空间元素（删除快捷方式、标题、空行、卡片等）
    5. 添加home代码块到工作空间
    6. 执行logo替换配置
    """
    try:
        # 1. 执行品牌化配置（修改应用标题）
        setup_branding()
        
        # 2. 执行logo替换配置（替换logo文件）
        print("🎨 开始执行logo替换配置...")
        logo_success = setup_logo_replacement()
        if logo_success:
            print("✅ logo替换配置成功")
        else:
            print("⚠️ logo替换配置失败，但继续安装")
        
        # 3. 创建自定义 HTML 块记录
        create_home_html_block()
        
        # 4. 配置Home工作空间
        setup_home_workspace()
        
        # 5. 导入工作空间快捷方式
        import_workspace_shortcuts_on_install()
        
        # 6. 添加架构图菜单项
        add_architecture_menu_on_install()
        
        # 7. 定制帮助下拉菜单
        customize_help_dropdown_on_install()
        
        # 提交数据库事务
        frappe.db.commit()
        
        frappe.msgprint("✅ Theme Custom 安装完成，品牌化配置、Logo替换、导航块创建、工作空间配置和快捷方式导入成功！", alert=True)
        
    except Exception as e:
        # 回滚事务
        frappe.db.rollback()
        frappe.log_error(f"Theme Custom 安装过程中出现错误: {str(e)}")
        frappe.throw(f"安装过程中出现错误: {str(e)}")


def setup_branding():
    """
    设置品牌化配置
    1. 修改 ERPNext 的标题为 NextJia
    2. 修改 Frappe Framework 的标题为 NexBlock
    """
    # 1. 处理 ERPNext 品牌化
    setup_erpnext_branding()
    
    # 2. 处理 Frappe Framework 品牌化
    setup_frappe_branding()


def setup_erpnext_branding():
    """
    设置 ERPNext 品牌化配置
    包含：
    1. 修改应用标题为 NextJia
    2. 更新所有logo引用路径
    """
    # 检查 ERPNext 应用是否存在
    if "erpnext" not in frappe.get_installed_apps():
        frappe.log_error("ERPNext 应用未安装，跳过品牌化配置")
        return
    
    # 获取 ERPNext hooks.py 文件的路径
    erpnext_hooks_path = os.path.join(
        frappe.get_app_path("erpnext"), "hooks.py"
    )
    
    # 检查文件是否存在
    if not os.path.exists(erpnext_hooks_path):
        frappe.log_error(f"ERPNext hooks.py 文件不存在: {erpnext_hooks_path}")
        return
    
    # 创建通用备份文件
    backup_path = erpnext_hooks_path + ".theme_backup"
    if not os.path.exists(backup_path):
        shutil.copy2(erpnext_hooks_path, backup_path)
        frappe.log_error(f"已创建 ERPNext hooks.py 备份文件: {backup_path}")
    
    # 读取文件内容
    with open(erpnext_hooks_path, 'r', encoding='utf-8') as file:
        content = file.read()
    
    # 使用正则表达式进行精确替换，避免误替换
    # 只替换 app_title，不修改 app_name（重要：app_name 是系统标识符，不能修改）
    app_title_pattern = r'^app_title\s*=\s*["\']ERPNext["\']'
    
    # 检查是否已经被修改过
    if 'app_title = "NextJia"' in content:
        print("📝 ERPNext 应用标题已经是 NextJia，跳过品牌化配置")
        
        # 但仍需检查logo是否已更新，如果没有则更新
        if '/assets/theme/images/nextjia-logo.svg' not in content:
            print("🔄 检测到logo需要更新，继续执行...")
        else:
            return
    
    # 执行替换 - 修改标题
    content = re.sub(app_title_pattern, 'app_title = "NextJia"', content, flags=re.MULTILINE)
    
    # 使用统一的logo更新函数
    content = update_logo_references_in_content(content)
    
    # 写回文件
    with open(erpnext_hooks_path, 'w', encoding='utf-8') as file:
        file.write(content)
    
    print("✅ 成功修改 ERPNext 应用标题和 Logo 为 NextJia 品牌")


def setup_frappe_branding():
    """
    设置 Frappe Framework 品牌化配置
    将 app_title 从 "Frappe Framework" 改为 "NexBlock"
    """
    # 获取 Frappe hooks.py 文件的路径
    frappe_hooks_path = os.path.join(
        frappe.get_app_path("frappe"), "hooks.py"
    )
    
    # 检查文件是否存在
    if not os.path.exists(frappe_hooks_path):
        frappe.log_error(f"Frappe hooks.py 文件不存在: {frappe_hooks_path}")
        return
    
    # 创建备份文件
    backup_path = frappe_hooks_path + ".theme_backup"
    if not os.path.exists(backup_path):
        shutil.copy2(frappe_hooks_path, backup_path)
        frappe.log_error(f"已创建 Frappe hooks.py 备份文件: {backup_path}")
    
    # 读取文件内容
    with open(frappe_hooks_path, 'r', encoding='utf-8') as file:
        content = file.read()
    
    # 使用正则表达式进行精确替换
    app_title_pattern = r'^app_title\s*=\s*["\']Frappe Framework["\']'
    
    # 检查是否已经被修改过
    if 'app_title = "NexBlock"' in content:
        print("📝 Frappe 应用标题已经是 NexBlock，跳过品牌化配置")
        return
    
    # 执行替换 - 修改标题
    content = re.sub(app_title_pattern, 'app_title = "NexBlock"', content, flags=re.MULTILINE)
    
    # 写回文件
    with open(frappe_hooks_path, 'w', encoding='utf-8') as file:
        file.write(content)
    
    print("✅ 成功修改 Frappe Framework 应用标题为 NexBlock")


def create_home_html_block():
    """
    创建主页导航 HTML 块记录
    使用分离的 HTML 和 CSS 文件
    """
    # 从文件中读取 HTML 和 CSS 内容
    home_html = get_home_navigation_html()
    home_css = get_home_navigation_css()
    
    # 检查内容是否成功读取
    if not home_html or not home_css:
        print("❌ 无法读取主页导航内容文件，跳过创建")
        return
    
    # 使用通用函数创建 HTML 块
    create_html_block(
        name="home",
        html_content=home_html,
        css_content=home_css,
        script_content="",  # 暂时不添加 JavaScript
        private=0  # 设为公开，所有用户可见
    )


def setup_home_workspace():
    """
    配置Home工作空间
    1. 备份当前配置
    2. 清理不需要的元素（快捷方式、标题、空行、卡片等）
    3. 添加home自定义块
    """
    try:
        print("🔧 开始配置Home工作空间...")
        
        # 1. 备份当前Home工作空间配置
        print("📋 备份Home工作空间配置...")
        backup_path = backup_workspace("Home")
        if not backup_path:
            print("⚠️ 备份失败，但继续执行配置")
        
        # 2. 清理工作空间元素，只保留html和custom_block类型
        print("🧹 清理Home工作空间元素...")
        clean_success = clean_workspace_elements(
            workspace_name="Home",
            keep_types=["html", "custom_block"]
        )
        
        if not clean_success:
            print("⚠️ 清理工作空间元素失败，但继续执行")
        
        # 3. 添加home自定义块到工作空间顶部
        print("➕ 添加home自定义块到工作空间...")
        add_success = add_custom_block_to_workspace(
            workspace_name="Home",
            block_name="home",
            position="top"
        )
        
        if add_success:
            print("✅ Home工作空间配置完成")
        else:
            print("⚠️ 添加自定义块失败")
        
        # 4. 执行数据迁移以确保更改生效
        print("🔄 执行数据迁移...")
        frappe.db.commit()
        
    except Exception as e:
        frappe.log_error(f"配置Home工作空间时出错: {str(e)}")
        print(f"❌ 配置Home工作空间失败: {str(e)}")
        raise Exception(f"配置Home工作空间时出错: {str(e)}")


def before_uninstall():
    """
    在 theme 应用卸载前执行的函数
    1. 恢复Home工作空间配置
    2. 删除安装时创建的 home HTML 块记录
    3. 安全地恢复 ERPNext 的 hooks.py 文件，将 app_name 和 app_title 恢复为原始值
    4. 安全地恢复 Frappe Framework 的 hooks.py 文件，将 app_title 恢复为原始值
    """
    try:
        # 1. 恢复Home工作空间配置
        restore_home_workspace()
        
        # 2. 删除 home HTML 块记录
        delete_home_html_block()
        
        # 3. 移除工作空间快捷方式
        remove_workspace_shortcuts_on_uninstall()
        
        # 4. 移除架构图菜单项
        remove_architecture_menu_on_uninstall()
        
        # 5. 恢复帮助下拉菜单
        restore_help_dropdown_on_uninstall()
        
        # 6. 恢复 ERPNext 品牌化配置
        restore_erpnext_branding()
        
        # 7. 恢复 Frappe Framework 品牌化配置
        restore_frappe_branding()
        
        # 8. 恢复原始logo配置
        print("🔄 开始恢复logo配置...")
        try:
            restore_logo_replacement()
            print("✅ Logo配置恢复完成")
        except Exception as e:
            print(f"⚠️ Logo配置恢复过程中出现错误: {str(e)}")
            frappe.log_error(f"Logo配置恢复失败: {str(e)}")
        
        # 提交数据库事务
        frappe.db.commit()
        
        frappe.msgprint("✅ Theme Custom 卸载完成，已清理所有相关数据并恢复原始配置！", alert=True)
        
    except Exception as e:
        # 回滚事务
        frappe.db.rollback()
        frappe.log_error(f"Theme Custom 卸载过程中出现错误: {str(e)}")
        frappe.throw(f"卸载过程中出现错误: {str(e)}")


def add_architecture_menu_on_install():
    """
    安装时添加架构图菜单项
    """
    try:
        print("📋 开始添加架构图菜单项...")
        
        # 添加架构图菜单项
        success = add_architecture_menu_item()
        
        if success:
            print("✅ 架构图菜单项添加完成")
        else:
            print("⚠️ 架构图菜单项添加失败，请检查日志")
        
    except Exception as e:
        frappe.log_error(f"安装时添加架构图菜单项出错: {str(e)}")
        print(f"❌ 添加架构图菜单项失败: {str(e)}")


def import_workspace_shortcuts_on_install():
    """
    安装时导入工作空间快捷方式
    """
    try:
        print("📋 开始导入工作空间快捷方式...")
        
        # 导入工作空间快捷方式
        success = import_workspace_shortcuts()
        
        if success:
            print("✅ 工作空间快捷方式导入完成")
        else:
            print("⚠️ 工作空间快捷方式导入失败，请检查日志")
        
    except Exception as e:
        frappe.log_error(f"安装时导入工作空间快捷方式出错: {str(e)}")
        print(f"❌ 导入工作空间快捷方式失败: {str(e)}")


def customize_help_dropdown_on_install():
    """
    安装时定制帮助下拉菜单
    """
    try:
        print("📋 开始定制帮助菜单...")
        
        # 备份现有帮助下拉菜单
        backup_navbar_help_dropdown()
        
        # 移除不需要的帮助下拉项
        remove_help_dropdown_items()
        
        print("✅ 帮助菜单定制完成")
        
    except Exception as e:
        frappe.log_error(f"安装时定制帮助菜单出错: {str(e)}")
        print(f"❌ 帮助菜单定制失败: {str(e)}")